﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;
using System.Configuration;
using System.Data;

namespace FBS.Framework
{
    public class Util
    {
        public static void LimparCampos(Page page)
        {
            foreach (Control content in page.Form.Controls)
            {

                if (content is ContentPlaceHolder)
                {
                    foreach (Control child in content.Controls)
                    {
                        if (child is TextBox)
                        {
                            ((TextBox)child).Text = "";
                        }

                        else if (child is CheckBox)
                        {
                            ((CheckBox)child).Checked = false;
                        }

                    }
                }
            }
        }

        public static void GravarLog(String Mensagem, String Sistema)
        {
            //StreamWriter sw = File.AppendText(Path.Combine(ConfigurationManager.AppSettings["LogPath"], DateTime.Now.Month.ToString() + DateTime.Now.Year.ToString() + ".log"));
            //sw.WriteLine(DateTime.Now.ToString() + " [" + Sistema + "] " + Mensagem);
            //sw.Close();
        }

        public static void RemoverLog()
        {
            File.Delete(System.AppDomain.CurrentDomain.BaseDirectory + @"\Erro_EDE.log");
        }

        /// <summary>
        /// Retorrna o nome da página indicada pela URL, sem o path e sem a extensão
        /// </summary>
        /// <param name="url">URL da página</param>
        /// <returns>Nome do formulário</returns>
        public static string FormName(string url)
        {
            string NomeCompleto = url.Split('/')[url.Split('/').Length - 1];
            return NomeCompleto;//.Substring(0, NomeCompleto.IndexOf('.')).ToUpper();
        }

        public static System.Drawing.Image byteArrayToImage(byte[] byteArrayIn)
        {
            MemoryStream ms = new MemoryStream(byteArrayIn);
            System.Drawing.Image returnImage = System.Drawing.Image.FromStream(ms);
            return returnImage;
        }

        public static byte[] ConvertImageToByteArray(System.Drawing.Image imageToConvert,
                                       System.Drawing.Imaging.ImageFormat formatOfImage)
        {
            byte[] Ret;
            try
            {
                using (MemoryStream ms = new MemoryStream())
                {
                    imageToConvert.Save(ms, formatOfImage);
                    Ret = ms.ToArray();
                }
            }
            catch (Exception) { throw; }
            return Ret;
        }

        public static void CopyPropertyValues(object source, object destination)
        {
            var destProperties = destination.GetType().GetProperties();

            foreach (var sourceProperty in source.GetType().GetProperties())
            {
                foreach (var destProperty in destProperties)
                {
                    if (destProperty.Name == sourceProperty.Name && destProperty.PropertyType.IsAssignableFrom(sourceProperty.PropertyType))
                    {
                        destProperty.SetValue(destination, sourceProperty.GetValue(source, new object[] { }), new object[] { });
                        break;
                    }
                }
            }
        }

        /// <summary>
        /// GeraArqCSV - Cria arquivo CSV a partir do Datatable.
        /// </summary>
        /// <param name="pFile">Nome completo do arquivo TXT a ser gerado.</param>
        /// <param name="dt">Data Table para geração do CSV</param>
        /// <param name="header">Determina se apresenta ou não Header na primeira coluna do arquivo CSV</param>
        /// <param name="quoteall">Determina se todos os campos serão gerados entre aspas.</param>
        /// <param name="append">Determina se faz um clear no arquivo ou apenas acrescenta registros.</param>
        /// <returns>Retorna o nome do arquivo com caminho completo</returns>
        public static string GeraArqCSV(string pFileName, DataTable pDataTable, bool pHeader, bool pQuoteAll, bool pAppendFile)
        {
            //Using saveFileDialog As SaveFileDialog = GetExcelSaveFileDialog()
            //    If (saveFileDialog.ShowDialog() = DialogResult.OK) Then
            string fileName = pFileName;
            //System.IO.StreamWriter wfile = null;
            StringWriter wfile = null;
            wfile = null;
            try
            {
                //
                //Abre arquivo de Log para edição
                //wfile = new System.IO.StreamWriter(fileName, pAppendFile, Encoding.UTF8);
                wfile = new StringWriter(); // new System.IO.StreamWriter(fileName, pAppendFile, Encoding.UTF8);
                //Grava linha no arquivo
                wfile.WriteLine(WriteToString(pDataTable, pHeader, pQuoteAll));
                //
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                wfile.Close();
            }
            //    End If
            //End Using
            return wfile.ToString();
        }

        /// <summary>
        /// GeraArqCSV - Cria o arquivo StringWriter para receber data table.
        /// </summary>
        /// <param name="table">DataTable a ser lido</param>
        /// <param name="header">Mostrar ou não o nome das colunas (True or False)</param>
        /// <param name="quoteall">Colocar aspas em todas as colunas ou não (True or False)</param>
        /// <returns>retorna um objeto string</returns>
        public static string WriteToString(DataTable pDataTable, bool pHeader, bool pQuoteAll)
        {
            StringWriter writer = new StringWriter();

            WriteToStream(writer, pDataTable, pHeader, pQuoteAll);
            return writer.ToString();
        }

        /// <summary>
        /// GeraArqCSV - Varre o DataTable para identificar os headers dos itens
        /// </summary>
        /// <param name="stream">Objeto StringWriter()</param>
        /// <param name="table">Datatable a ser processado</param>
        /// <param name="header">Grava Header ou não na primeira linha...</param>
        /// <param name="quoteall">Preenche todos os campos com aspas ou apenas tipo String...</param>
        public static void WriteToStream(TextWriter pStream, DataTable pDataTable, bool pHeader, bool pQuoteAll)
        {
            //
            int r = 0;
            //Monta o Header do arquivo
            if (pHeader)
            {
                for (int i = 0; i <= pDataTable.Columns.Count - 1; i++)
                {
                    WriteItem(pStream, pDataTable.Columns[i].ColumnName, pQuoteAll);
                    if (i < pDataTable.Columns.Count - 1)
                    {
                        pStream.Write(';');
                    }
                    else
                    {
                        pStream.Write(System.Environment.NewLine);
                    }
                }
            }
            //preenche as linhas do arquivo
            foreach (DataRow row in pDataTable.Rows)
            {
                r += 1;
                for (int i = 0; i <= pDataTable.Columns.Count - 1; i++)
                {
                    //
                    WriteItem(pStream, row[i], pQuoteAll);
                    //
                    if (i < pDataTable.Columns.Count - 1)
                    {
                        pStream.Write(';');
                    }
                    else
                    {
                        //Se contador igual a última linha do Datatable
                        //não imprimir a quebra de linha
                        if (r < pDataTable.Rows.Count)
                        {
                            pStream.Write(System.Environment.NewLine);
                        }
                    }
                }
            }
        }

        //<summary>
        //GeraArqCSV - Monta linhas dos itens do datatable.
        //</summary>
        //<param name="stream">Objeto TextWriter</param>
        //<param name="item">Item do datatable...</param>
        //<param name="quoteall">Colocar aspas ou n�o...</param>
        //<remarks></remarks>
        private static void WriteItem(TextWriter pStream, object pItem, bool pQuoteAll)
        {
            if ((pItem == null))
            {
                return;
            }
            string s = pItem.ToString();
            // If quoteall OrElse s.IndexOfAny("""," & vbLf & vbCr.ToCharArray()) > -1 Then
            //     stream.Write("""" & s.Replace("""", """""") & """")
            // Else
            if ((pItem.GetType().Name == "String"))
            {
                // stream.Write("""" & s.Replace("""", """""") & """")
                // stream.Write("""" & s.Replace("", " ").Replace("""", """""") & """")
                pStream.Write(s.Replace("", " ").Replace("\"", "\"\""));
            }
            else
            {
                pStream.Write(s.Replace(",", "."));
            }
            // End If
        }
    }
}
